package com.xjh.basestudy.designmode.behaviorMode.behaviorMode5_Status.p2_status;

/**
 * @Author XuJianHua
 * @Date 2022/10/4 16:54
 * @Description
 * 客户端一开始实例化了交通灯，接着按照交规进行了一系列的交通灯切换操作，可以看到输出一切正常。
 * 注意第16行，操作失败后会收到告警信息，这说明即便切换了错误的状态，也不会酿成车祸，状态切换及校验机制工作正常。
 *
 * 至此，状态模式的应用将系统状态从系统环境（系统宿主）中彻底抽离出来，状态接口确立了高层统一规范，使状态响应机制分立、自治，以一种松耦合的方式实现了系统状态与行为的联动机制。
 * 如此一来，系统环境不再处理任何状态响应及切换逻辑，而是转发给当前状态对象去处理，同时将自身引用“this” 传递下去。
 * 也就是说，系统环境只需要持有当前状态，而不必再关心如何根据状态进行响应，或是如何进行状态更新了
 *
 * 我的理解：
 * 交通灯有一个颜色对象（state实现类对象，默认为红灯）
 *
 * 通过调用交通灯对象的三种状态转换方法来实现转换灯颜色的目的。
 *
 * 这三个方法分别做了什么呢（比如在实现类对象为红灯对象的时候，调用红灯实现类对象的转为黄灯方法）？
 *
 * 根据不同的实现类对象，调用他们对应的不同德军实现方法。
 *
 * 如果允许转换则把该交通灯的状态实现类对象，转为需要的状态实现类对象，如果不允许转换，则抛出异常。
 *
 * 核心就是在对象没有被修改的前提下改变了行为（原理就是都实现了state接口）
 */
public class Client {

    public static void main(String args[]) {
        // 创建一个交通灯，默认为红色。
        // 如果要转成黄色， 调用交通灯对象的state.switchToYellow(this); 其中state被默认定义为红灯对象
        //  红灯对象的switchToYellow方法实现了以下功能：将状态对象转为黄灯实现类对象，实现黄灯功能。
        //      trafficLight.setState(new Yellow());
        //        System.out.println("OK...黄灯亮起5秒");
        TrafficLight trafficLight = new TrafficLight();
        trafficLight.switchToYellow();
        trafficLight.switchToGreen();
        trafficLight.switchToYellow();
        trafficLight.switchToRed();

     /*
        OK...黄灯亮起5秒
        OK...绿灯亮起60秒
        OK...黄灯亮起5秒
        OK...红灯亮起60秒
        ERROR!!!红灯不能切换为绿灯
     */
    }
}
